// interface Stack<T> {
//   count: number
//   items: {
//     [key: number]: T
//   }
// }

interface IItem<T> {
  [key: number]: T
}

class Stack<T> {
  constructor(private count: number = 0, private items: IItem<T> = {}) {}

  // 添加一个或多个元素到栈顶
  push(...element: T[]): void {
    for (let i = 0; i < element.length; i++) {
      this.items[this.count++] = element[i]
    }
  }

  // 移除栈顶的元素，同时返回被移除的元素。
  pop(): T | undefined {
    const popItem = this.items[this.size() - 1]
    delete this.items[this.count--]
    return popItem
  }

  // 返回栈顶的元素，不对栈做任何修改(该方法不会移除栈顶的元素，仅仅返回它)
  peek(): T | undefined {
    return this.items[this.size() - 1]
  }

  // 如果栈里没有任何元素就返回 true，否则返回 false。
  isEmpty(): boolean {
    return this.count === 0
  }

  // 移除栈里的所有元素
  clear(): void {
    this.items = {}
    this.count = 0
  }

  // 返回栈里的元素个数。该方法和数组的 length 属性很类似。
  size(): number {
    return this.count
  }

  // 创建toString方法
  toString() {
    let str = ''
    let i = 0
    while (i <= this.count) {
      str += ' ' + this.items[i++]
    }
    return str
  }
}

export default Stack
